<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 1、Object 对象本身的方法
  // 2、Object 的实例方法
  Object.prototype.sayHello = function () {
    console.log('hello Object');
  }

  var obj = new Object();
  obj.sayHello();


  // Object 的静态方法
  // 1、Object.keys(对象);
  // 返回一个包含所有给定对象自身可枚举属性名称的数组。
  var arr = ['a', 'b', 'c'];
  console.log(Object.keys(arr));    //["0", "1", "2"]
  var obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    3: 'd'
  }
  console.log(Object.keys(obj));    //["0", "1", "2", "3"]


  // 2、Object.getOwnPropertyNames()
  // 返回一个数组，它包含了指定对象所有的可枚举或不可枚举的属性名。
  // 与 keys()的区别是，keys()只能获取可枚举的属性
  var arr = ['a', 'b', 'c'];
  console.log(Object.getOwnPropertyNames(arr));    // ["0", "1", "2", "length"]
  var obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    3: 'd'
  }
  console.log(Object.getOwnPropertyNames(obj));    // ["0", "1", "2", "3"]


  // 3、Object.getPrototypeOf()
  // 返回指定对象的原型对象。
  function Fn() { }
  var f1 = new Fn();
  console.log(Object.getPrototypeOf(f1) === Fn.prototype);    // true
  // 几种特殊对象的原型
  // 空对象的原型是 Object.prototype
  console.log(Object.getPrototypeOf({}) === Object.prototype);    //true
  // Object.prototype 的原型是 null
  console.log(Object.getPrototypeOf(Object.prototype) === null);    //true
  // 函数的原型是 Function.prototype
  function f() { }
  console.log(Object.getPrototypeOf(f) === Function.prototype);    //true


  // 4、Object.setPrototypeOf()
  // 设置对象的原型（即内部 [[Prototype]] 属性）。
  // 接收两个参数，第一个参数是现有的对象，第二个是原型对象
  var a = {};
  var b = { x: 1 };
  Object.setPrototypeOf(a, b);
  console.log(a.x);   // 1
  console.log(Object.getPrototypeOf(a));    // {x: 1}

  // 模拟 new 关键字
  function F(){
    this.foo = 'f00';
  }
  // var f = new F();
  var f = Object.setPrototypeOf({},F.prototype);
  F.call(f);
  console.log(f);


  // Object.create()
  // 使用指定的原型对象和属性创建一个新对象。
  var A = {
    hello:function(){
      console.log('hello');
    }
  }
  var B = Object.create(A);
  console.log(Object.getPrototypeOf(B));
  B.hello();
  // 其他方法
</script>

</html>